Skip to content

Conversation

@ValuedMammal
Copy link
Collaborator

@ValuedMammal ValuedMammal commented Oct 29, 2025

Description

Previously build_fee_bump could error with UnknownUtxo if a parent of the tx being fee-bumped wasn't found in the wallet. This made it impossible to use build_fee_bump on a transaction created using add_foreign_utxo. This PR is a refactor of build_fee_bump that manages to avoid the error by instead querying the tx graph for the txout specifically. This is a reasonable assumption because the previous txouts are necessary to compute the fee of the original tx.

I've included a test in 6f214d5 to demonstrate the old behavior which now passes.

may resolve #325.

Notes to the reviewers

Changelog notice

TBD

Checklists

All Submissions:

New Features:

Bugfixes:

  • [ ] This pull request breaks the existing API
  • I've added tests to reproduce the issue which are now passing
  • I'm linking the issue being fixed by this PR

@ValuedMammal ValuedMammal requested a review from nymius October 29, 2025 17:39
@ValuedMammal ValuedMammal marked this pull request as draft October 29, 2025 17:39
@coveralls
Copy link

coveralls commented Oct 29, 2025

Pull Request Test Coverage Report for Build 19005356703

Details

  • 44 of 44 (100.0%) changed or added relevant lines in 1 file are covered.
  • No unchanged relevant lines lost coverage.
  • Overall coverage increased (+0.1%) to 85.138%

Totals Coverage Status
Change from base Build 18891447990: 0.1%
Covered Lines: 7006
Relevant Lines: 8229

💛 - Coveralls

Copy link
Contributor

@nymius nymius left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Concept ACK 8a08bf5

let fee_rate = self
.calculate_fee_rate(&tx)
.map_err(|_| BuildFeeBumpError::FeeRateUnavailable)?;
let fee_rate = fee / tx.weight();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the rationale to not use calculate_fee_rate?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seemed redundant since calculate_fee_rate already calls calculate_fee, so I chose to inline the implementation here.

.script_pubkey();
let witness_utxo = TxOut {
value: Amount::ZERO,
script_pubkey: ScriptBuf::new_p2a(),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

new_p2a is not in rust-bitcoin 0.32.6, but in rust-bitcoin 0.32.7. Missing Cargo.toml update I guess

}

#[test]
fn test_add_foreign_utxo_bump_fee() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would mention the type of script used in the first tx input, as I think is important for discoverability and also to illustrate the context of what this test is doing.

let tx = psbt.unsigned_tx.clone();
assert!(tx.input.iter().any(|txin| txin.previous_output == outpoint));
let txid1 = tx.compute_txid();
insert_tx(&mut wallet, tx);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A comment about the state in which this Tx is inserted from the perspective of the wallet would be helpful.
Like assume tx was broadcasted and is in mempool

};

let mut tx_builder = wallet.build_tx();
tx_builder
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The default fee rate of this tx is important but not expressed in the creation of the first tx of the test. A comment may be necessary here.

}) {
// This is a local utxo.
Some(&(keychain, derivation_index)) => {
let txout = prev_txout.ok_or(BuildFeeBumpError::UnknownUtxo(outpoint))?;
Copy link
Contributor

@nymius nymius Oct 31, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the error here is impossible to reach.
If the spk is present on the index, then this wallet collaborated on the creation of the transaction with the signature of that input, then that UTXO should have been already known by this wallet, right?
Also, we are getting this from the TxGraph itself and using an and_then call. All UnknownUtxos will be transformed into None and parsed by the other match arm before reaching this line.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will look for a way to rewrite it for clarity. I agree we should always have the txout, as otherwise we'd fail at calculate_fee.

@ValuedMammal ValuedMammal force-pushed the fix/build_fee_bump_foreign_utxo branch from f143e1f to 592217f Compare November 5, 2025 01:50
@codecov
Copy link

codecov bot commented Nov 5, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 85.24%. Comparing base (36f98df) to head (592217f).
⚠️ Report is 10 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master     #337      +/-   ##
==========================================
+ Coverage   84.81%   85.24%   +0.43%     
==========================================
  Files          23       23              
  Lines        8145     8229      +84     
==========================================
+ Hits         6908     7015     +107     
+ Misses       1237     1214      -23     
Flag Coverage Δ
rust 85.24% <100.00%> (+0.43%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@ValuedMammal ValuedMammal marked this pull request as ready for review November 5, 2025 02:20
@ValuedMammal ValuedMammal moved this to In Progress in BDK Wallet Nov 5, 2025
@ValuedMammal ValuedMammal added this to the Wallet 2.3.0 milestone Nov 5, 2025
@ValuedMammal ValuedMammal self-assigned this Nov 5, 2025
@notmandatory
Copy link
Member

I see this PR is in the "Wallet 2.3.0" milestone but merging to the master branch. Is the plan to merge it to master then back port it to release/2.x ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In Progress

Development

Successfully merging this pull request may close these issues.

Can't build a fee bump transaction if spending a P2A output

4 participants